#pragma once
#include <cstddef>
#include <new.h>
#include "Allocator.h"
namespace mini
{
	struct __true_type
	{

	};

	struct __false_type
	{

	};

	template<typename T>
	struct __type_trait
	{
		typedef __true_type this_dummy_member_must_be_first;
		typedef __false_type has_trivial_default_constructor;
		typedef __false_type has_trivial_copy_constructor;
		typedef __false_type has_assignment_operator;
		typedef __false_type has_destructor;
		typedef __false_type is_POD_type;
	};
	template<>
	struct __type_trait<char>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<unsigned char>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<short>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<unsigned short>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<int>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};


	template<>
	struct __type_trait<unsigned int>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<long>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<unsigned long>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<float>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};

	template<>
	struct __type_trait<double>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};


	template<typename T>
	struct __type_trait<T*>
	{
		typedef __true_type has_trivial_default_constructor;
		typedef __true_type has_trivial_copy_constructor;
		typedef __true_type has_assignment_operator;
		typedef __true_type has_destructor;
		typedef __true_type is_POD_type;
	};
}